<template>
  <!-- 最外层的容器 -->
  <view class="my-checkout-container">
    <!-- 全选区域 -->
    <label class="radio">
      <radio
        color="#C00000"
        :checked="isCheckedAll"
        @click="handleRadioClick(!isCheckedAll)"
      />
      <text>全选</text>
    </label>
    <!-- 合计区域 -->
    <view class="amount-box">
      合计:<text class="amount">￥{{ checkedAmount }}</text>
    </view>
    <!-- 结算按钮 -->
    <view class="btn-checkout" @click="handleCheckout"
      >结算({{ checkedTotal }})</view
    >
  </view>
</template>

<script>
import { mapGetters, mapState } from 'vuex'
export default {
  data() {
    return {
      // 倒计时的描述
      seconds: 3,
      // 设置一个定时器对象
      timer: null,
    }
  },
  computed: {
    ...mapGetters('cart', ['checkedTotal', 'total', 'checkedAmount']),
    ...mapState('user', ['address', 'token']),
    ...mapGetters('user', ['fullAddress']),
    // 全选和不全选
    isCheckedAll() {
      return this.total > 0 && this.checkedTotal === this.total
    },
  },
  methods: {
    // 1. 处理全选单选框的点击
    handleRadioClick(flag) {
      this.$store.commit('cart/updateAllState', flag)
    },
    // 2. 点击结算按钮
    handleCheckout() {
      if (this.checkedTotal === 0) return this.$msg('请勾选要结算的商品')
      if (!this.fullAddress) return this.$msg('请选择收货的地址')
      if (!this.token) {
        // 没有登录
        return this.delayNavigator()
      }
      console.log('我要去付款了...')
      // 调用微信支付
      this.payOrder()
    },
    // 3. 3秒跳转到登录页
    delayNavigator() {
      // 3.1 重置秒数
      this.seconds = 3
      // 3.2 重置提示信息
      this.$msg(`请登录后再结算, ${this.seconds}s后跳转到登录页`)
      // ************注意: 先清除定时器, 后设置定时器 ***********
      clearInterval(this.timer)
      // 3.3 设置定时器
      this.timer = setInterval(() => {
        this.seconds--
        if (this.seconds <= 0) {
          // 清除定时器
          clearInterval(this.timer)

          // 跳转之前把当前页面的信息存储到vuex中
          this.$store.commit('user/setRedirectInfo', {
            type: 'tab', // tab
            url: '/pages/cart/cart',
          })

          // 跳转到登录页
          uni.switchTab({
            url: '/pages/my/my',
          })
        } else {
          this.$msg(`请登录后再结算, ${this.seconds}s后跳转到登录页`)
        }
      }, 1000)
    },
    // 4. 微信支付
    async payOrder() {
      // 1. 创建订单
      // 1.1 发送请求
      const { meta, message } = await this.$http.post('/my/orders/create', {
        // 开发期间不填写真实的订单价格，写死订单总价为1分钱
        order_price: 0.01,
        // 收获地址
        consignee_addr: this.fullAddress,
        // 购物车中选中的商品
        goods: this.$store.state.cart.cartItems
          .filter((x) => x.goods_state)
          .map((x) => ({
            goods_id: x.goods_id,
            goods_number: x.goods_count,
            goods_price: x.goods_price,
          })),
      })

      if (meta.status !== 200) {
        return this.$msg('创建订单失败！')
      }

      // 1.2 得到 “订单编号”
      const orderNumber = message.order_number
      console.log('订单编号', orderNumber)

      // 2. 订单预支付
      // 2.1 请求获取订单的支付信息
      const { meta: meta2, message: message2 } = await this.$http.post(
        '/my/orders/req_unifiedorder',
        {
          order_number: orderNumber,
        }
      )

      // 2.2 预付订单生成失败
      if (meta2.status !== 200) {
        return this.$msg('预付订单生成失败！')
      }

      // 2.3 得到订单支付相关的必要参数
      const payInfo = message2.pay
      console.log('支付的必要信息', payInfo)

      // 3. 发起微信支付
      // 3.1 弹出微信支付界面
      const [err, res] = await uni.requestPayment(payInfo)

      if (err) {
        return this.$msg('订单支付失败！')
      }

      console.log('微信支付返回的结果', res)

      // 3.2 查询支付结果
      const { meta: meta3 } = await this.$http.post('/my/orders/chkOrder', {
        order_number: orderNumber,
      })

      if (meta3.status !== 200) {
        return this.$msg('订单支付失败！')
      }

      // 3.3 提示支付完成
      this.$msg('订单支付成功')
    },
  },
}
</script>

<style lang="scss">
.my-checkout-container {
  position: fixed;
  bottom: 0;
  left: 0;
  z-index: 999;
  width: 100%;
  height: 100rpx;
  background-color: white;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-left: 10rpx;
  font-size: 28rpx;

  .radio {
    display: flex;
    align-items: center;
  }

  .amount {
    color: #c00000;
  }

  .btn-checkout {
    height: 100rpx;
    min-width: 200rpx;
    background-color: #c00000;
    color: white;
    line-height: 100rpx;
    text-align: center;
    padding: 0 20rpx;
  }
}
</style>
